﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Helena.Areas.Productos.Models;
using Telerik.Web.Mvc;
using Helena.Areas.Categorias.Models;
using Helena.Areas.Campanas.Models;
using Helena.Areas.Configuraciones.Models;
using System.Threading;
using System.IO;
using System.Text;
using Helena.Areas.Proveedores.Models;
using Helena.Areas.Vendedores.Models;

namespace Helena.Areas.Productos.Controllers
{
    public class ProductoController : Controller
    {
        LogicaProducto db = new LogicaProducto();
        LogicaCategoria cat_db = new LogicaCategoria();
        LogicaCampana cam_db = new LogicaCampana();
        LogicaUnidad uni_db = new LogicaUnidad();
        LogicaProveedor pro_db = new LogicaProveedor();
        
        #region Comun
        
        public ActionResult Index()
        {
            VendedorView vw = (VendedorView)Session["Vendedor"];
            if (vw.ID != 0)
            {
                ObtenerCategorias();
                ObtenerCampanas();
                ObtenerUnidades();
                ObtenerProveedores();
                ObtenerProductos();
                return View("IndexProducto");
            }
            else
            {
                return Redirect("../Home/NoSession");
            }
           
        }

        [GridAction]
        public ActionResult Select()
        {
            return View("Index", new GridModel(db.i_RetornarProductos()));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        [GridAction]
        public ActionResult Insert()
        {

            ProductoView p_v = new ProductoView();
            if (TryUpdateModel(p_v))
            {
                db.i_AgregarProducto(p_v);
            }
            return View("Index", new GridModel(db.i_RetornarProductos()));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        [GridAction]
        public ActionResult Delete(int? id)
        {
            int ID = id ?? -1;
            db.i_EliminarProducto(ID);
            return View("Index", new GridModel(db.i_RetornarProductos()));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        [GridAction]
        public ActionResult Update(ProductoView c)
        {
            db.i_ModificarProducto(c);
            return View("Index", new GridModel(db.i_RetornarProductos()));
        }
       
        #endregion

        #region Detalles

        [GridAction]
        public ActionResult _DetalleProducto(int ProductoID)
        {
            return View(new GridModel(db.DetallesDeUnProducto(ProductoID)));
        }


        public ActionResult AddSubProduct(int ProductoID)
        {
            Session["ProductoBase"] = ProductoID;
            return Redirect("../../DetalleProducto");
            
        }
        
        #endregion

        #region Extras


        private void ObtenerCategorias()
        {
            ViewData["Categorias"] = cat_db.i_RetornarCategorias();
                //db.context_publico.t_Categorias
                //.Select(e => new { ID = e.ID, Nombre = e.NombreCategoria })
                //.OrderBy(e => e.Nombre).ToList();        
        }

        private void ObtenerCampanas()
        {
            ViewData["Campanas"] = cam_db.i_RetornarCampanas();
        }        

        private void ObtenerUnidades()
        {
            ViewData["Unidades"] = uni_db.i_RetornarUnidades();
        }

        private void ObtenerProductos()
        {
            ViewData["Productos"]= db.i_RetornarProductos();
        }

        private void ObtenerProveedores()
        {
            ViewData["Proveedores"] = pro_db.i_RetornarProveedores();
        }

        #endregion

        public ActionResult ExportarProductos()
        {

            MemoryStream output = new MemoryStream();
            StreamWriter writer = new StreamWriter(output, Encoding.UTF8);

            writer.Write("Categoria");
            writer.Write(",");
            writer.Write("Campaña");
            writer.Write(",");
            writer.Write("Unidad");
            writer.Write(",");
            writer.Write("Nombre del Producto");
            writer.Write(",");
            writer.Write("Precio de Fabrica");
            writer.Write(",");
            writer.Write("Precio de Venta");
            writer.Write(",");
            writer.Write("Stock");
            writer.Write(",");
            writer.Write("Activo");
            writer.Write(",");
            writer.Write(" ");
            writer.Write(",");
            writer.Write(" ");
            writer.Write(",");
            writer.Write(" ");
            writer.Write(",");
            writer.WriteLine();

            List<ProductoView> pro = db.i_RetornarProductos().OrderBy(p=>p.categoriaID).ToList();
            foreach (ProductoView p in pro)
            {
                writer.Write(cat_db.i_RetornarCategoria(p.categoriaID).NombreCategoria);
                writer.Write(",");
                writer.Write(cam_db.i_RetornarCampana(p.campanaID).NombreCampana);
                writer.Write(",");
                writer.Write(uni_db.i_RetornarUnidad(p.unidadID).descripcion);
                writer.Write(",");
                writer.Write(p.Descripcion);
                writer.Write(",");
                writer.Write("S/ " + p.preciofabrica);
                writer.Write(",");
                writer.Write("S/ " + p.precioventa);
                writer.Write(",");
                writer.Write(p.cantidad);
                writer.Write(",");
                writer.Write(p.Estado);
                writer.Write(",");

                List<DetalleProductoView> detalles = db.DetallesDeUnProducto(p.ID).Where(e=>e.Estado==true).ToList();
                if (detalles.Count != 0)
                {
                    writer.Write("Sub Producto");
                    writer.Write(",");
                    writer.Write("Unidad");
                    writer.Write(",");
                    writer.Write("Cantidad");
                    writer.Write(",");
                    writer.Write("Precio");
                    writer.Write(",");
                    writer.WriteLine();
                    foreach (DetalleProductoView d in detalles)
                    {
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(" ");
                        writer.Write(",");
                        writer.Write(db.i_RetornarProducto(d.ProductoSID).Descripcion);
                        writer.Write(",");
                        writer.Write(uni_db.i_RetornarUnidad(d.UnidadID).descripcion);
                        writer.Write(",");
                        writer.Write(d.Cantidad);
                        writer.Write(",");
                        writer.Write("S/ "+d.PrecioVenta);
                        writer.Write(",");
                        writer.WriteLine();
                    }
                }
                else
                {
                    writer.WriteLine();
                }
            }
            writer.Flush();
            output.Position = 0;

            return File(output, "text/comma-separated-values", "Lista de Productos.csv");
        }
                       

    }
}
